package cn.akwangl.common.controller;

import cn.akwangl.common.uoload.aliyun.ALiOSS;
import cn.akwangl.common.uoload.aliyun.ALiRAM;
import cn.akwangl.common.uoload.utils.FileNameUtils;
import cn.akwangl.common.uoload.utils.FileUtils;
import cn.akwangl.common.uoload.vo.FileInfo;
import com.aliyuncs.auth.sts.AssumeRoleResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

/**
 * @author: youyongkun
 * @Date: 2019/9/11 16:07
 * 功能描述:
 * 阿里OSS 文件上传本地
 */
@RestController
@RequestMapping("/aliUpload")
public class AliUploadLoadController {

    @Value("${web.upload-base-windows-path}")
    private String windowsPath;
    @Value("${web.upload-base-linux-path}")
    private String linuxPath;
    @Value("${web.url-prefix}")
    private String urlPrefix;

    @Autowired
    private ALiRAM aLiRAM;

    @Autowired
    private ALiOSS aLiOSS;

    /**
     * @author: youyongkun
     * @Date: 2019/9/10 21:13
     * 功能描述:
     * 上传图片至服务器
     */
    @PostMapping("/fileImg")
    public Map localUploadImg(@RequestParam("file") MultipartFile file) {
        Map<String, Object> result = new HashMap<>();
        if (file.isEmpty()) {
            // 保存文件到本地目录
            result.put("code", 404);
            result.put("msg", "文件为空！");
            return result;
        }
        // 获取文件名 => xxx.png
        String fileName = file.getOriginalFilename();
        // 文件后缀名获取 => .xxx
        String fileSuffix = FileNameUtils.getSuffix(fileName);
        // 判断是否是支持上传的文件 如果需要支持其它文件格式，请再 FileNameUtils.FILE_NAME_SUFFIX 增加即可！
        if (!FileNameUtils.isPicture(fileSuffix, FileNameUtils.FILE_NAME_IMG_SUFFIX)) {
            result.put("code", 405);
            result.put("msg", "该文件不支持！仅支持：" + FileNameUtils.FILE_NAME_IMG_SUFFIX + "格式图片！");
            return result;
        }
        // 根据日期创建文件夹
        String folderDateName = FileUtils.getDateStr(FileUtils.FOLDER_FORMAT);
        // 拼接新文件 => 09ce7d06da714979a15a9c16119e5553.png
        String newFileName = FileNameUtils.getFileName(fileSuffix);
        // 图片保存路径
        String path = windowsPath + folderDateName;
        // 访问url
        String imgUrl = urlPrefix + folderDateName + "/" + newFileName;
        if (FileUtils.uploadLocal(file, path, newFileName)) {
            // 保存文件到本地目录
            result.put("code", 200);
            result.put("msg", "上传成功！");
            result.put("imgUrl", imgUrl);
            return result;
        }
        // 保存文件到本地目录
        result.put("code", 4015);
        result.put("msg", "上传失败！");
        return result;
    }

    /**
     * @author: youyongkun
     * @Date: 2019/9/10 21:12
     * 功能描述:
     * 上传文件至服务器
     */
    @PostMapping("/file")
    public Map localUploadFile(@RequestParam("file") MultipartFile file) {
        Map<String, Object> result = new HashMap<>();
        if (file.isEmpty()) {
            // 保存文件到本地目录
            result.put("code", 404);
            result.put("msg", "文件为空！");
            return result;
        }
        // 获取文件名 => xxx.png
        String fileName = file.getOriginalFilename();
        // 文件后缀名获取 => .xxx
        String fileSuffix = FileNameUtils.getSuffix(fileName);
        // 根据日期创建文件夹
        String folderDateName = FileUtils.getDateStr(FileUtils.FOLDER_FORMAT);
        // 拼接新文件 => 09ce7d06da714979a15a9c16119e5553.png
        String newFileName = FileNameUtils.getFileName(fileSuffix);
        // 图片保存路径
        String path = windowsPath + folderDateName;
        // 访问url
        String imgUrl = urlPrefix + folderDateName + "/" + newFileName;
        try {
            AssumeRoleResponse roleResponse = aLiRAM.getToken();
            System.out.println("roleResponse => " + roleResponse);
            boolean b = aLiOSS.upLoad(roleResponse, file.getInputStream());
            System.out.println("是否上传成功："+b);
        } catch (IOException e) {
            e.printStackTrace();
        }

//        if (FileUtils.uploadLocal(file, path, newFileName)) {
//            // 保存文件到本地目录
//            result.put("code", 200);
//            result.put("msg", "上传成功！");
//            result.put("imgUrl", imgUrl);
//            return result;
//        }
        // 保存文件到本地目录
        result.put("code", 4015);
        result.put("msg", "上传失败！");
        return result;
    }

    /**
     * @author: youyongkun
     * @Date: 2019/9/10 21:12
     * 功能描述:
     * 删除文件接口
     */
    @PostMapping("/local/delFile")
    public Map delFile(@RequestBody FileInfo fileInfo) {
        Map<String, Object> result = new HashMap<>();
        try {
            // 刪除的路径
            String delPath = windowsPath + (fileInfo.getUrl().substring(urlPrefix.length()));
            if (FileUtils.deleteFile(new File(delPath))) {
                result.put("code", 200);
                result.put("msg", "刪除成功！");
                return result;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        result.put("code", 4015);
        result.put("msg", "刪除失败！");
        return result;
    }

}
